home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Game-Power
/
Amiga Game-Power.iso
/
pd mix ii
/
click to front
/
heliosmouse
/
helios-handler.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-20
|
4KB
|
133 lines
/*
* Helio-Handler.c Input Handler for HeliosMouse. Helios-handler
* calls ActivateWindow() whenever the mouse moves
* over a new window.
*
* Copyright (c) 1987 by Davide P. Cervone
* You may use this code provided this copyright notice is left intact.
*/
#include <exec/types.h>
#include <devices/inputevent.h>
#include <intuition/intuitionbase.h>
static char *version = "Helios-Handler v1.0 (June 1987)";
static char *author = "Copyright (c) 1987 by Davide P. Cervone";
extern struct Layer *WhichLayer();
extern void myHandlerStub();
/*
* The window associated with a given Layer structure.
*/
#define WINDOW(layer) ((struct Window *)((layer)->Window))
/*
* The top line of a screen (in INTERLACED lines)
*/
#define SCREENTOP\
(theScreen->TopEdge << ((theScreen->ViewPort.Modes & LACE)? 0: 1))
struct IntuitionBase *IntuitionBase = NULL;
struct LayersBase *LayersBase = NULL;
struct SysBase *SysBase = NULL;
/*
* Setup()
*
* HeliosMouse calls LoadSeg() to get this handler into memory. The segment
* that it gets points to this routine. HeliosMouse calls Setup() and
* passes the IntuitionBase, LayersBase and SysBase pointers that it
* has initialized (with OpenLibrary()). Setup returns a pointer to
* the actual input handler, which HeliosMouse installs.
*/
long Setup(Ibase,Lbase,Sbase)
struct IntuitionBase *Ibase;
struct LayersBase *Lbase;
struct SysBase *Sbase;
{
IntuitionBase = Ibase;
LayersBase = Lbase;
SysBase = Sbase;
return((long) &myHandlerStub);
}
/*
* myHandler()
*
* This is the input handler. Whenever a mouse move or a keyboard event
* occurs, we check to see if the mouse is over an inactive window, and
* if so, we activate that window.
*
* To do this, we get the current absolute Y position of the mouse and
* look through the Intuition screens for the first one that is closer
* to the top of the View than the mouse is (i.e., the first one that is
* high enough to be under the mouse). Note that we must convert non-
* interlace screen coordinates to interlaces ones in order to be able
* to compare them to the mouse position (the SCREENTOP macro does this).
* If no screen is found (this should never happen, but just in case), then
* just use the currently active one.
*
* From the selected screen we get the mouse x and y position (if it's a
* mouse move, we add the event offsets to find the new mouse position).
* Using these, we call WhichLayer(), which tells us which Layer within
* that screen the mouse was pointing at. If that layer has a window and
* that window is not currently the active window, we activate it.
*
* When we're all through looking at events, we pass the list on, so that
* Intuition (and any other handlers) can do their things.
*
* Compile this section with -dKEY_ONLY to have windows activate only when
* a key is pressed (not when the mouse moves over an inactive one).
*/
struct InputEvent *myHandler(EventList,data)
struct InputEvent *EventList;
APTR data;
{
register struct InputEvent *theEvent = EventList;
register struct Layer *theLayer;
register struct Window *theWindow;
register struct Screen *theScreen;
register long x,y;
Forbid();
while(theEvent)
{
if (
#ifndef KEY_ONLY
(theEvent->ie_Class == IECLASS_RAWMOUSE &&
(theEvent->ie_X != 0 || theEvent->ie_Y != 0)) ||
#endif
(theEvent->ie_Class == IECLASS_RAWKEY)
)
{
y = IntuitionBase->MouseY;
theScreen = IntuitionBase->FirstScreen;
while (theScreen && y < SCREENTOP) theScreen = theScreen->NextScreen;
if (theScreen == NULL) theScreen = IntuitionBase->ActiveScreen;
x = theScreen->MouseX;
y = theScreen->MouseY;
#ifndef KEY_ONLY
if (theEvent->ie_Class == IECLASS_RAWMOUSE)
{
x += theEvent->ie_X;
y += theEvent->ie_Y;
}
#endif
theLayer = WhichLayer(&(theScreen->LayerInfo),x,y);
if (theLayer && (theWindow = WINDOW(theLayer)))
if (theWindow != IntuitionBase->ActiveWindow)
ActivateWindow(theWindow);
}
theEvent = theEvent->ie_NextEvent;
}
Permit();
return(EventList);
}